// 这个文件用于定义当前reducer模块的 state数据 和 action执行操作

const store={
    // 存放数据
    state:{
      num:20
    },

    // 存放同步的操作方法
    actions:{   // actions中只放同步的操作方法，异步方法要结合redux-thunk使用
      add1(newState:{num:number},action:{type:string}){
        newState.num++
      },
      add2(newState:{num:number},action:{type:string,val:number}){
        newState.num+=action.val
      },
      // 由于这个add3操作方法中执行了异步操作，在这里使用不了
      add3(newState:{num:number},action:{type:string,val:number}){
        // 这里进行了异步操作，那么当这个操作方法被调用的时候，会有bug，不会达到想要的效果
        // 如果想要执行异步操作，得先安装并且配置redux-thunk，并且得在组件中使用异步操作
        setTimeout(()=>{
          newState.num+=action.val
        },2000)
      },
    },

    // 存放异步的操作方法(模仿Vuex的写法)，借助redux-thunk
    asyncActions:{  // 只存放异步方法
      asyncAdd1(disptach){
        setTimeout(()=>{
          disptach({type:"add1"})
        },2000)
      }
    },

    // 存放操作类型名称
    // 下面这种方式过于麻烦，一旦上面新添加了一个操作方法，下面就需要手动添加对应的一个操作类型名称
    /* actionNames:{
      add1:"add1",
      add2:"add2"
    } */

    // 所以可以用下面这种方式
    // 实现actionNames自动生成，不需要每次添加一个actions操作方法，就要写一个对应的操作类型名称
    actionNames:{}
}
const actionNames = {}
// 遍历仓库中的操作方法
for(const key in store.actions){
  // 这里的 key 获取的是actions中每一个方法的方法名
  actionNames[key] = key  // 向actionNames对象中添加一个属性名和属性值都为当前遍历出的key的属性
}
// 将actionNames赋值给仓库中的actionNames，这一步过后，如果仓库的新添加了操作方法，那么actionNames就会自动生成这个操作方法对应的操作类型名称
store.actionNames = actionNames;


export default store